package com.bjsxt.base.conn013_master_worker;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedDeque;

public class Master {
    // 1 应该有一个承装任务的集合,工作队列
    private ConcurrentLinkedDeque<Task> workQueue = new ConcurrentLinkedDeque<>();
    // 2 使用 HashMap 承装所有的 Worker 对象
    private HashMap<String, Thread> workers = new HashMap<>();
    // 3 使用一个容器承装每个 Worker 并发执行任务的结果集
    private ConcurrentHashMap<String, Object> resultMap = new ConcurrentHashMap<>();

    // 4 构造方法
    public Master(Worker worker, int workerCount) {
        // 每一个 workder 对象都需要有 Master的应用 workQueue用于任务的领取，resultMap 用于任务返回
        worker.setWorkerQueue(workQueue);
        worker.setResultMap(resultMap);
        for(int i=0; i<workerCount; i++) {
            // key 每一个workder的名字，value表示线程执行对象
            workers.put("子节点"+Integer.toString(i), new Thread(worker));
        }
    }

    // 5 提交方法
    public void submit(Task task) {
        this.workQueue.add(task);
    }

    // 6 需要有一个执行的方法（启动应用程序，让所有的workder工作）
    public void execute() {
        for (Map.Entry<String, Thread> me : workers.entrySet()) {
            me.getValue().start();
        }
    }

    // 8判断线程是否执行完毕
    public boolean isComplete() {
        for (Map.Entry<String, Thread> me : workers.entrySet()) {
            if (me.getValue().getState() != Thread.State.TERMINATED) {
                return false;
            }
        }
        return true;
    }
    // 9 返回结果集
    public int getResult() {
        int ret = 0;
        for (Map.Entry<String, Object> me : resultMap.entrySet()) {
            ret += (Integer) me.getValue();
        }
        return ret;
    }
}
